package modelo.test;

import java.util.Collection;
import java.util.LinkedList;

import junit.framework.TestCase;
import junit.framework.TestSuite;
import modelo.enemigos.Arana;
import modelo.enemigos.Enemigo;
import modelo.juego.Configuracion;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;
import modelo.torres.Torre;
import modelo.torres.TorreBlanca;
import modelo.torres.TorreDorada;
import modelo.torres.TorrePlateada;

public class PruebaTorre extends TestCase {

	private Torre torre;
	private Mapa mapa = new Mapa(Configuracion.TAMANIO_MAPA);
	
	public void testCrearTorreBlanca() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);
		
		torre = new TorreBlanca(c);
		assertEquals(Configuracion.ALCANCE_TORRE_BLANCA, torre.getAlcance());
		assertEquals(Configuracion.DANIO_TORRE_BLANCA, torre.getDanio());
		assertEquals(Configuracion.COSTO_TORRE_BLANCA, torre.getCosto());
	}

	public void testCrearTorrePlateada() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);

		torre = new TorrePlateada(c);
		assertEquals(Configuracion.ALCANCE_TORRE_PLATEADA, torre.getAlcance());
		assertEquals(Configuracion.DANIO_TORRE_PLATEADA, torre.getDanio());
		assertEquals(Configuracion.COSTO_TORRE_PLATEADA, torre.getCosto());
	}

	public void testCrearTorreDorada() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);

		torre = new TorreDorada(c);
		assertEquals(Configuracion.ALCANCE_TORRE_DORADA, torre.getAlcance());
		assertEquals(Configuracion.DANIO_TORRE_DORADA, torre.getDanio());
		assertEquals(Configuracion.COSTO_TORRE_DORADA, torre.getCosto());
	}

	public void testGetCasillero() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);

		torre = new TorreDorada(c);
		assertEquals(c, torre.getCasillero());
	}

	public void testSetCasillero() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);
		Casillero d = this.mapa.GetCasilleroXY(6, 10);

		torre = new TorreBlanca(c);
		torre.setCasillero(d);
		assertEquals(d, torre.getCasillero());
	}

	public void testSetAlcance() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);

		torre = new TorreBlanca(c);

		torre.setAlcance(50);
		assertEquals(50, torre.getAlcance());
	}

	public void testSetCosto() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);
		torre = new TorreBlanca(c);

		torre.setCosto(50);
		assertEquals(50, torre.getCosto());
	}

	public void testSetDanio() {
		mapa.setCamino();
		Casillero c = this.mapa.GetCasilleroXY(2, 4);
		torre = new TorreBlanca(c);

		torre.setDanio(50);
		assertEquals(50, torre.getDanio());
	}

	public void testDefinirObjetivo() {
		mapa.setCamino();
		Casillero c1 = mapa.GetCasilleroXY(3, 4);
		Enemigo e1 = new Arana(c1);

		Casillero c2 = mapa.GetCasilleroXY(1, 5);
		Enemigo e2 = new Arana(c2);

		Casillero c3 = mapa.GetCasilleroXY(4, 5);
		Enemigo e3 = new Arana(c3);

		torre = new TorreBlanca(c3);
		Collection<Enemigo> enemigos = new LinkedList<Enemigo>();

		enemigos.add(e2);
		enemigos.add(e1);
		enemigos.add(e3);

		assertEquals(e3, torre.definirObjetivo((LinkedList<Enemigo>) enemigos));
	}

	public static TestSuite suite() {
		TestSuite suite = new TestSuite();
		suite.addTestSuite(PruebaTorre.class);
		return suite;
	}
}
